// 实现对象的迭代器
let obj = {
  arr: [1, 2, 3, 4, 5],
  [Symbol.iterator]() {
    let index = 0;
    let arr = this.arr;

    return {
      next() {
        if (index < arr.length) {
          return {
            value: arr[index++],
            done: false,
          };
        } else {
          return {
            value: undefined,
            done: true,
          };
        }
      },
    };
  },
};

let arr = [1, 2, 3, 4, 5];

// 重写数组的迭代器
Array.prototype[Symbol.iterator] = function () {
  let index = 0;
  let arr = this;
  return {
    next() {
      if (index < arr.length) {
        return {
          value: arr[index++],
          done: false,
        };
      } else {
        return {
          value: undefined,
          done: true,
        };
      }
    },
  };
};

// 先调用对象的迭代器函数，得到一个含有next 方法的对象，然后，再不停的调用next 函数，得到结果对象，判断对象的done 属性是不是true ，不是的话，将对象的 value 值赋值给item ，done 的属性是true 的话则暂停

for (let item of arr) {
  console.log(item);
}

// 使用对象迭代器
let generator = obj[Symbol.iterator]();

for (let item of arr) {
  console.log(item);
}

while (1) {
  let data = generator.next();
  if (data.done) {
    break;
  } else {
    console.log(data.value);
  }
}
